#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<cerrno>
#include<string.h>
#include<cstdio>
#include<cstdlib>

using namespace std;

int tickets=100;
void* threadRoutine(void* args)
{
    char* msg=(char*)args;
    while(true)
    {
        if(tickets > 0)
        {
            cout<<(char*)msg<<" send "<<tickets<<" tickets "<<endl;
            sleep(1);
            tickets--;
        }
        else
        {
            break;
        }
    }
    return nullptr;
}
int main()
{
    pthread_t t1,t2;
    pthread_create(&t1,nullptr,threadRoutine,(void*)"thread 1");
    pthread_create(&t2,nullptr,threadRoutine,(void*)"thread 1");
    
    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);
    return 0;
}
// int tickets=100;
// void* threadRoutine(void* args)
// {
//     char* msg=(char*)args;
//     while(true)
//     {
//         if(tickets > 0)
//         {
//             sleep(1);
//             cout<<msg<<" send "<<tickets<<" tickets"<<endl;
//             tickets--;
//         }
//         else
//         {
//             break;
//         }
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t t1,t2,t3;
//     pthread_create(&t1,nullptr,threadRoutine,(void*)"thread 1");
//     pthread_create(&t2,nullptr,threadRoutine,(void*)"thread 1");
//     pthread_create(&t3,nullptr,threadRoutine,(void*)"thread 1");
    
//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);
//     pthread_join(t3,nullptr);

//     return 0;
// }
// void* threadRoutine(void* args)
// {
//     pthread_detach(pthread_self());
//     cout<<(char*)args<<endl;
//     int a=10;
//     a/=0;
//     return nullptr;
// }
// int main()
// {
//     pthread_t id;
//     int ret=pthread_create(&id,nullptr,threadRoutine,(void*)"thread 1");
//     if(ret != 0)
//     {
//         perror("pthread_create()");
//         exit(-1);
//     }
//     int flag=5;
//     while(--flag)
//     {
//         cout<<"I am main thread"<<endl;
//     }
//     // int res=pthread_join(id,nullptr);
//     // if(res == 0)
//     // {
//     //     cout<<"thread wait success"<<endl;
//     //     flag=0;
//     // }
//     // else
//     // {
//     //     cout<<"thread wait failed"<<endl;
//     //     flag=1;
//     // }
//     // cout<<res<<endl;
//     return 0;
// }
// void* thread1(void* args)
// {
//     cout<<"thread 1 returning"<<endl;
//     int* p=new int(1);
//     return(void*)p;
// }
// void* thread2(void* args)
// {
//     cout<<"thread 2 exiting"<<endl;
//     int* p=new int(2);
//     return (void*)p;
// }
// void* thread3(void* args)
// {
//     while(true)
//     {
//         cout<<"thead 3 running"<<endl;
//         sleepz(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t id;
//     void* ret;

//     pthread_create(&id,nullptr,thread1,nullptr);
//     pthread_join(id,&ret);
//     printf("thread return:thread id:%X,thread return code is:%d",id,*(int*)ret);
//     free(ret);

//     pthread_create(&id,nullptr,thread2,nullptr);
//     pthread_join(id,&ret);
//     printf("thread return:thread id:%X,thread return code is:%d",id,*(int*)ret);
//     free(ret);

//     pthread_create(&id,nullptr,thread3,nullptr);
//     sleep(3);
//     pthread_cancel(id);
//     pthread_join(&id,&ret);
//     if(ret == PTHREAD_CANCELED)
//     {
//         //线程被取消掉以后ret指针当中存放的是一个常数
//         printf("thread id:%X,thread code:PTHREAD_CENCELED",id);
//     }
//     else
//     {
//         //这里发生异常，没有正确接受到返回值
//         printf("thread id:%X,thread code:NULL",id);
//     }
//     return 0;
// }
//不管怎么样今天晚上一定要把生产者消费者模型敲完
// void* handler(void* args)
// {
//     while(true)
//     {
//         cout<<"I am a thread 1"<<endl;
//         sleep(1);
//     }
// }
//pthread_create()的第一个参数会指向一个虚拟地址单元，给内存
//单元的地址即位创建线程的线程ID
/*
void pthread_exit(void* value_ptr)
这个函数没有返回值，线程结束的时候无法返回到它的调用者
但是指针所指向的内容却是可以返回到主线程，但是必须是全局变量
或者是堆上开辟的数据，不能是局部变量等栈上开辟的内容
int pthread_cancel(pthread_t thread);
成功返回0，失败返回错误码
int pthread_join(pthread_t id,void** value_ptr)
成功返回0，失败返回错误码
*/
// int main()
// {
//     pthread_t id;
//     int ret=pthread_create(&id,nullptr,handler,nullptr);
//     if(ret != 0)
//     {
//         perror("pthread_create()");
//         exit(-1);
//     }
//     while(true)
//     {
//         cout<<"I am main thread "<<endl;
//         sleep(1);
//     }
//     return 0;
// }
// void* handler(void* args)
// {
//     for(;;)
//     {
//         cout<<"I am a thread 1"<<endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t id;
//     //这里是从线程要完成的任务
//     int ret=pthread_create(&id,nullptr,handler,nullptr);
//     if(ret != 0)
//     {
//         fprintf(stderr,"pthread_create:%s\n",strerror(ret));
//         exit(EXIT_FAILURE);
//     }
//     //这里是主线程要完成的任务
//     for(;;)
//     {
//         cout<<"I am a thread"<<endl;
//         sleep(1);
//     }
//     return 0;
// }